(function ($) {
var textareasToListen = [];
var buttonsToListen = [];
var alertedOnFail = false;
var consecutiveFailCount = 0;
var textById = {};
var updateButtonsPosition = function () {
$.each(textareasToListen, function (index, textarea) {
var button = buttonsToListen[index];
var buttonContainer = textarea;
if (buttonContainer.is(":hidden")) {
button.hide();
}
var buttonContainerSelector = button.attr("buttonContainerSelector");
if (buttonContainerSelector && buttonContainerSelector.length > 0) {
buttonContainer = $($(buttonContainerSelector)[0]);
}
var xOffset = buttonContainer.get(0).clientWidth - button.outerWidth() - 6;
var yOffset = 8;
var buttonXOffset = button.attr("buttonXOffset");
if (buttonXOffset) {
xOffset += parseInt(buttonXOffset);
}
var buttonYOffset = button.attr("buttonYOffset");
if (buttonYOffset) {
yOffset += parseInt(buttonYOffset);
}
button.css("top", buttonContainer.position().top + yOffset);
button.css("left", buttonContainer.position().left + xOffset);
if (!buttonContainer.is(":hidden")) {
button.show();
}
});
};
setInterval(updateButtonsPosition, 200);
function showDraftsPopup(textarea, settings) {
var popup = $(".drafts-popup");
var entries = popup.find(".drafts-entries");
entries.find(".drafts-button").click(function () {
settings["useItHandler"](textarea, $(this).parent().prev().text());
$(".drafts-popup").fadeOut();
});
popup.show();
popup.css("top", pageYOffset);
}
function addDraftEntry(item, settings) {
var popup = $(".drafts-popup");
var entries = popup.find(".drafts-entries");
var hasSame = false;
entries.find(".drafts-entry-body").each(function () {
if ($(this).text() == item) {
hasSame = true;
return false;
}
});
if (!hasSame) {
$("
").text(item).appendTo(entries);
$("" + settings["textUseIt"] + "
").appendTo(entries);
}
}
function addFromLocalStorage(publicKey, key, settings) {
if (publicKey && key) {
var text = window.localStorage["draft-" + publicKey];
if (text) {
try {
text = sjcl.decrypt(key, text);
addDraftEntry(text, settings);
} catch (e) {
window.localStorage.removeItem("draft-" + publicKey);
}
}
}
}
function putToLocalStorage(publicKey, key, text) {
if (publicKey && key && text) {
if (window.localStorage) {
window.localStorage["draft-" + publicKey] = sjcl.encrypt(key, text);
}
}
}
$.fn.drafts = function (options) {
var settings = $.extend({
textDrafts: 'Drafts',
textUseIt: 'Use it',
url: '/data/drafts.php',
pollDelay: 5000,
showDelay: 2500,
saveErrorMessage: "Can't save draft. Possibly connection is lost or session is expired. Stay on the page (cancel to reload)?",
useItHandler: function (textarea, text) {
textarea.val(text);
}
});
$.extend(settings, {
saveErrorHandler: function () {
if (!confirm(settings["saveErrorMessage"])) {
location.reload();
}
}
});
$.extend(settings, options);
var textareas = this;
var hasDraftsPrototype = false;
var hasDraftsPopup = false;
setTimeout(function () {
textareas.each(function () {
var textarea = $(this);
if (textarea.parent()[0].tagName.toLowerCase() === "arclones") {
return;
}
if (!hasDraftsPrototype && $(".drafts-prototype").length === 0) {
$(""
+ settings["textDrafts"]
+ "
").appendTo($("body"));
hasDraftsPrototype = true;
}
if (!hasDraftsPopup && $(".drafts-popup").length === 0) {
$("").appendTo($("body"));
hasDraftsPopup = true;
}
if (textarea.prop("tagName").toLowerCase() !== "textarea") {
$.error("jquery.drafts.js can be used only for textareas, but " + textarea.prop("tagName").toLowerCase() + " found.");
}
if (!textarea.attr("data-drafts-id")) {
$.error("jquery.drafts.js requires textarea to have attribute data-drafts-id.");
}
var id = textarea.attr("data-drafts-id");
var publicKey;
var key;
var textChanged = false;
window.setTimeout(function () {
textarea.change(function () {
textChanged = true;
});
textarea.bind('input propertychange', function () {
textChanged = true;
});
}, 60000);
window.setInterval(function () {
if (!key) {
$.post(settings["url"], {action: 'getKey', id: id}, function (result) {
publicKey = result["publicKey"];
key = result["key"];
}, "json");
}
if (key && textChanged) {
putToLocalStorage(publicKey, key, textarea.val());
textChanged = false;
}
}, 1000);
var button = $(".drafts-prototype").clone()
.removeClass("drafts-prototype")
.css("opacity", "0.2");
button.mouseover(function () {
button.css("opacity", "1.0");
});
button.mouseleave(function () {
button.css("opacity", "0.2");
});
button.click(function () {
var popup = $(".drafts-popup");
var entries = popup.find(".drafts-entries");
//entries.empty();
//addFromLocalStorage(id, settings);
//showDraftsPopup(settings);
$.post(settings["url"], {action: 'get', id: id}, function (items) {
entries.empty();
addFromLocalStorage(publicKey, key, settings);
$.each(items, function (index, item) {
addDraftEntry(item, settings);
});
showDraftsPopup(textarea, settings);
}, "json");
});
var buttonXOffset = settings["buttonXOffset"];
if (buttonXOffset) {
button.attr("buttonXOffset", buttonXOffset);
}
var buttonYOffset = settings["buttonYOffset"];
if (buttonYOffset) {
button.attr("buttonYOffset", buttonYOffset);
}
var buttonContainerSelector = settings["buttonContainerSelector"];
if (buttonContainerSelector && buttonContainerSelector.length > 0) {
button.attr("buttonContainerSelector", buttonContainerSelector);
$($(buttonContainerSelector)[0]).append(button);
} else {
$(textarea.parent()).append(button);
}
button.css("position", "absolute");
textareasToListen.push(textarea);
buttonsToListen.push(button);
updateButtonsPosition();
$(".drafts-popup .drafts-close").click(function () {
$(".drafts-popup").fadeOut();
});
$(document).keydown(function(e) {
if (e.keyCode === 27) {
$(".drafts-popup").fadeOut();
}
});
window.setInterval(function () {
var text = textarea.val();
var innerButton = button.find(".drafts-button");
if (textById[id] === text) {
return;
}
textById[id] = text;
$.post(settings["url"], {action: 'put', id: id, text: text}, function (response) {
if (response === "OK") {
consecutiveFailCount = 0;
if (!innerButton.hasClass("drafts-online")) {
innerButton.removeClass("drafts-offline");
innerButton.addClass("drafts-online");
}
} else {
++consecutiveFailCount;
if (!innerButton.hasClass("drafts-offline")) {
innerButton.removeClass("drafts-online");
innerButton.addClass("drafts-offline");
}
if (consecutiveFailCount >= 5 * textareasToListen.length && !alertedOnFail) {
alertedOnFail = true;
settings["saveErrorHandler"]();
}
}
}, "json").fail(function () {
++consecutiveFailCount;
if (!innerButton.hasClass("drafts-offline")) {
innerButton.removeClass("drafts-online");
innerButton.addClass("drafts-offline");
}
if (consecutiveFailCount >= 5 * textareasToListen.length && !alertedOnFail) {
alertedOnFail = true;
settings["saveErrorHandler"]();
}
});
}, settings["pollDelay"]);
});
}, settings["showDelay"]);
return this;
};
})(jQuery);